
/**
 * 联合类型
 *  就是一个变量,可以俩类型.
 */
/* let a : string | number = 1;
a = '222' */


/* 
字面量类型
    写什么类型,就是什么类型.
    
*/
// let a : 1; // 这种就是a只能是1 这种类型,1不代表值,而是一种类型

/* 
字面量 + 联合类型 = 字典
*/
// let sex : 'male' | 'female' = 'male'; // 性别二选一,只能是这俩类型
// sex = 'female';
// sex = '333'; // 会报错



/* 
any: 等同于对这个类型设置为js, ts不处理这个变量的类型检测. 
*/
/* let a: any = 1;
a = 'string';
a = true;
a = {}; */


/* 
// ts解析器,会默认为 隐式any值
let a ; 
*/
// any 类型,赋值给谁,谁就变成any.
// unknown: 是不能赋值给 已有变量的值.
// unknown 是一个类型安全的any,不能直接赋值给其他变量.


/* let a : any = 1;
let c : unknown = 3;

let s : string = 'hello';

s = a; // any可以直接给到已知类型的值,而且不报错.
s = c; // 这句话会报错,因为unknown会报错,因为c是unknown不能接受已知类型的值.  */





/* unknown 是一个类型安全的any,不能直接赋值给其他变量.
    有两种方式: */
/* let a: unknown = '';
let s: string = '';

// 方法1: 使用typeof测试类型是string ,那么就可以做赋值操作.
if(typeof a === 'string'){
    s = a;
}

// 方法2: 类型断言
s = a as string;

// 断言写法2
s = <string>a; */



/* 
void : 函数返回值是undefined
*/
/* function aa ():void{
    
    // return 1; // 不允许任何返回值,计算写return 也是直接写分号.
    return;
} */


/* 
never: 从来不会到达的地方, 比如某些函数是用来报错的. 所以函数连undefined都无法返回.
*/
function neverFn(n:number):never{
    throw new Error("你好")
}
